package br.com.goldentrade.util;


import java.awt.BorderLayout;
import java.awt.Window;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Set;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;

import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JScrollPane;


public class ScannerClass {
	
//	private ArrayList<String> classes = null;
//	private ArrayList<String> methods = null;
//	private static ScannerClass sc = null;
//	
//	public ArrayList<String> filters = new ArrayList<String>();
//	
//	public static FrameConsulta fc = null;
//	
//	private ScannerClass(){
//		//scan();
//	}
//	
//	public static ScannerClass getInstance(){
//		if(sc==null)
//			sc = new ScannerClass();
//		return sc;
//	}
//	
//	public void clear(){
//		sc = null;
//	}
//	
//	public void scan(){
//		
//		scan(Thread.currentThread().getContextClassLoader(),  
//				Collections.EMPTY_SET, Collections.EMPTY_SET);
//	}
//	
//	public void scan(ClassLoader classLoader, Set<String> locations,  Set<String> packages) {
//		
//		if (!(classLoader instanceof URLClassLoader)) {  
//			return;  
//		}
//		
//		classes = new ArrayList<String>();
//		methods = new ArrayList<String>();
//
//		URLClassLoader urlLoader = (URLClassLoader) classLoader;  
//		URL[] urls = urlLoader.getURLs();
//		
//		for (URL url : urls) {
//			String path = url.getFile();  
//			File location = null;
//			URI uri  = null;
//			try {  
//				uri = url.toURI();
//				location = new File(uri);  
//			} catch (URISyntaxException e) {  
//				e.printStackTrace();  
//				continue;  
//			} catch (Exception e) {  
//				e.printStackTrace();
//				if(uri!=null)
//					System.out.println(uri);
//				continue;  
//			}  
//
//			if (matchesAny(path, locations)) {  
//				if (location.isDirectory()) {  
//					getClassesInDirectory(null, location, packages);  
//				} else {  
//					getClassesInJar(location, packages);  
//				}  
//			}  
//		}  
//		
//	}  
//	
//	
//	public void getClassesInDirectory(String parent, File location,  
//			Set<String> packagePatterns) {  
//		File[] files = location.listFiles();  
//		StringBuilder builder = null;  
//
//		for (File file : files) {  
//			builder = new StringBuilder(100);  
//			builder.append(parent).append("/").append(file.getName());  
//			String packageOrClass = (parent == null ? file.getName() : builder.toString());  
//
//			if (file.isDirectory()) {  
//				getClassesInDirectory(packageOrClass, file, packagePatterns);  
//			} else if (file.getName().endsWith(".class")) {  
//				if (matchesAny(packageOrClass, packagePatterns)) {  
//					//System.out.println(packageOrClass);  
//					addClasse(packageOrClass);
//				}  
//			}  
//		}  
//	}  
//
//	public void getClassesInJar(File location,  
//			Set<String> packagePatterns) {  
//		try {  
//			JarFile jar = new JarFile(location);  
//			Enumeration entries = jar.entries();  
//
//			while (entries.hasMoreElements()) {  
//				ZipEntry entry = (ZipEntry) entries.nextElement();  
//				String name = entry.getName();  
//				if (!entry.isDirectory() && name.endsWith(".class")) {  
//					if (matchesAny(name, packagePatterns)) {  
////						/System.out.println(name);
//						addClasse(name);
//					}  
//				}  
//			}  
//		} catch (IOException ioe) {  
//			ioe.printStackTrace();  
//		}  
//	}  
//	
//	public void addClasse(String className){
//		
//		if(classes!=null){
//			className = className.replaceAll("/", ".");
//			if(className.contains("$")){
//				className = className.substring(className.indexOf('$'), className.length());
//			}
//			className = className.replaceAll(".class", "");
//			boolean add = false;
//			for (String filtro : filters) {
//				if(className.contains(filtro)){
//					add = true;
//					break;
//				}
//			}  
//			if(add){
//				classes.add(className);
////				/System.out.println(className);
//				try {
//					Class classe = ScannerClass.class.getClassLoader().loadClass(className);
//					addMethods(classe);
//				} catch (ClassNotFoundException e) {}
//			}
//		}
//	}
//	
//	public void addMethods(Class classe){
//		if(classe!=null){
//			if(classe.isAnnotationPresent(DaapAction.class)){
//				Method[] maths = classe.getDeclaredMethods();
//				for (Method method : maths) {
//					String m = classe.getName()+"."+method.getName();
//					methods.add(m);
//					//System.out.println(m);
//				}
//			}
//			Sorter.sortStrings(methods);
//		}
//	}
//	
//	public ArrayList<String> findMethod(String name){
//		
//		String[] filters = name.split("%"); 
//		String filter1 = null;
//		String filter2 = null;
//		String filter3 = null;
//		
//		if(filters.length>0)
//			filter1 = filters[0];
//		if(filters.length>1)
//			filter2 = filters[1];
//		if(filters.length>2)
//			filter3 = filters[2];
//		
//		ArrayList<String> al = new ArrayList<String>();
//		for (int i = 0; i < methods.size(); i++) {
//			String math = methods.get(i);
//			if((filter1==null || math.toLowerCase().contains(filter1.toLowerCase())) &&
//					(filter2==null || math.toLowerCase().contains(filter2.toLowerCase())) &&
//					(filter3==null || math.toLowerCase().contains(filter3.toLowerCase()))){
//				al.add(math);
//			}
//		}
//		return al;
//	}
//
//	public static boolean matchesAny(String text, Set<String> filters) {  
//		if (filters == null || filters.size() == 0) {  
//			return true;  
//		}  
//		for (String filter : filters) {  
//			if (text.indexOf(filter) != -1){  
//				return true;  
//			}  
//		}  
//		return false;  
//	}  
//	
//	public static String method = null;
//	public static String consultaMethod(Window window){
//		
//		method = null;
//		IResultConsulta rc = new IResultConsulta() {
//			public void resultConsulta(Object obj) {
//				method = (String) obj;
//			}
//		}; 
//		if(fc == null){
//			fc = new FrameConsulta(window, true, rc) {
//				
//				public void createFilterForm(JPanel panel) {
//					super.createFilterForm(panel);
//					lbCodigo.setVisible(false);
//					jtCodigo.setVisible(false);
//					table = new TableBase(new TableModelBase(new String[]{"Descri��o"}, new String[]{""}){
//						public Object getValueAt(int row, int column) {
//							String str = (String) this.getDados().get(row);
//							return str;
//						}
//						public Class getColumnClass(int c) {
//							return String.class;
//						}
//					}, 
//						new Integer[]{}, 
//						new Integer[]{}, false);
//					
//					panelTable.add(new JScrollPane(table), BorderLayout.CENTER);
//					panelNorth.setVisible(false);
//					adicionarEventos();
//				}
//				
//				protected void pesquisar() {
//					//table.setDados(findMethod(jtDescricao.getText()));
//					table.setDados(ScannerClass.getInstance().findMethod(jtDescricao.getText()));
//					//table.setDados(TelaController.getInstance().getManager().findMethod(jtDescricao.getText()));
//				}
//				public void refreshTable() {}
//				protected void excluir() throws GuiException {}
//				protected void cadastrar() {}
//				protected void refreshDados() {}
//				protected boolean verificarReferencias() {return false;}
//				public void resultConsulta(Object obj) {}
//
//				public void constructMenu(JMenuBar menu, FrameConsulta frame) {}
//			};
//			fc.setMultipleSelection(false);
//			fc.setModal(true);
//			fc.setSize(500, 300);
//		}
//		fc.requestFocusDescricao();
//		new FrameConfig(fc);
//		
//		return method;
//	}
//
//	public static void main(String[] args) {
//
//		ScannerClass.getInstance().filters.add("jdaap.gui.actions");
//		ScannerClass.getInstance().scan(Thread.currentThread().getContextClassLoader(),  
//				Collections.EMPTY_SET, Collections.EMPTY_SET);
//		
//		String method = consultaMethod(null);
//		System.out.println("SELECIONADO >>>> "+method);
//	}  
} 